v = [1, 2, 3, 4]
y = (x*x for x in v)
print(y)  # <generator object <genexpr> at 0x1019fe660>
print(next(y), next(y))  # 1 4

lst = [lambda x: x*i for i in range(4)]  # 该匿名函数，调用了外部非全局变量 i。也就是 enclosure(闭包)
res = [m(2) for m in lst]
print(res)  # [6,6,6,6]

# 该匿名函数，增加了一个默认参数 i
lst_i = [lambda x, i=i: x*i for i in range(4)]
res_i = [m(2) for m in lst_i]
print(res_i)  # [0,2,4,6]

"""
The reason is that closures (lambdas or otherwise) close over names, not values. 
When you define lambda x: test_fun(n, x), the n is not evaluated, because it is 
inside the function. It is evaluated when the function is called, at which time 
the value that is there is the last value from the loop.
https://stackoverflow.com/users/1427416/brenbarn

闭包，lambda 或者其他形式，根据名字来封装，并不是根据值(?)
在 lambda x:test_fun(n,x) 里面，n 并不获取。只有当 lambda 执行的时候，去获取 n 的值

在上面的 lambda 里面，lambda x:x+i ，也是，通过生成器生成了 4 个 lambda:
[lambda x: x*i, lambda x: x*i, lambda x: x*i, lambda x: x*i]
这个时候 i 都不去获取。在 res 里面，获取了 m , 也就是 lambda x: x*i ，然后调用 m(2)执行
就相当于： return 2*i
执行的时候，之前的 for 循环已经执行完成，这时候 i = 3，所以，所有的返回都是 2*3

后面一段：
lst_i = [lambda x, i=i: x*i for i in range(4)]
i 作为函数参数传入，i 就不是闭包范围的变量了。这时候组成的 lambda 数组就相当于：
def lambda_i(x,i):
    return x*i

[lambda_i(x,0), lambda_i(x,1), lambda_i(x,2), lambda_i(x,3)]

"""
